package com.example.service.impl;


import com.example.dao.SetMealDao;
import com.example.domain.message.RedisConstant;
import com.example.domain.pojo.Setmeal;
import com.example.domain.query.QueryPageBean;
import com.example.domain.result.PageResult;
import com.example.service.SetMealService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@Transactional
public class SetMealServiceImpl implements SetMealService {
    @Autowired
    private JedisPool jedisPool;

    @Autowired
    private SetMealDao setMealDao;

    //添加套餐
    @Override
    public void add(Integer[] checkgroupIds, Setmeal setmeal) {
        //1:将基本信息添加到对应的数据库
        setMealDao.add(setmeal);
        //2:添加中间表信息 循环遍历
        addMealAndGroup(checkgroupIds,setmeal.getId());
        //调用方法,将放入数据库的图片信息存放到redis中
        saveRedis(setmeal.getImg());

    }
    //将图片信息存储到redis中的方法抽取出来
    public void saveRedis(String imgName){
        // redis存储的是：key,value格式的数据，其中key都是字符串，value有5种不同的数据结构
        //键值对存在的,以map集合存在
        //1:将获得的数据键值对形式存储在数据库中
        //1.1:获取jedis对象
        Jedis jedisDB = jedisPool.getResource();
        //1.2存储数据,集合类型set :不允许重复元素 sadd(),图片的名称不可以重复
        //将数据库的所有图片名称存放到jedisDB中
        jedisDB.sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES,imgName);

    }



    //将图片名称保存到redis
    private  void savePic2Redis(String img){
        jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_DB_RESOURCES,img);
    }

    //将添加中间表的关联操作抽取出来
    public void addMealAndGroup(Integer[] ids,Integer mealid){
        //判断集合是否为空
        if(ids!=null&&ids.length>0){
            for (Integer checkgroupId : ids) {
                //将多个参数封装为map集合，在映射文件中根据map的key去对应的值
                Map<String,Integer> map=new HashMap<>();
                map.put("setmeal_id",mealid);
                map.put("checkgroup_id",checkgroupId);
                setMealDao.addMealAndGroup(map);
            }
        }

    }


    //分页查询数据
    @Override
    public PageResult queryPage(QueryPageBean queryPageBean) {
        //分页插件
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
        //查询结果封装为Page类
        Page<Setmeal> setmeals = setMealDao.selectBycondition(queryPageBean.getQueryString());
        return new PageResult(setmeals.getTotal(),setmeals.getResult());
    }

    @Override
    public List<Setmeal> findAll() {
       List<Setmeal> setmealList= setMealDao.findAll();
       //为什么查询为空
        System.out.println(setmealList);
        return setmealList;
    }

    @Override
    public Setmeal findById(Integer id) {
        Setmeal setmeal =setMealDao.findById(id);
        return setmeal;
    }

    //查询所有的套餐信息
    @Override
    public List<Setmeal> findMealName() {

       List<Setmeal> namelist=setMealDao.findAll();
       return namelist;
    }

    //排序呢查询最高的两个套餐,返回map集合,controller需要的时list集合,多条套餐记录如何逐一封装
    @Override
    public List<Map> findMealHot() {
        //按照订单的setmealid排序
        List<Map> map=setMealDao.findMealHot();
//        System.out.println(map);
        return map;
    }



    @Override
    public void deletesetMeal(Integer id) {
       setMealDao.deletesetMeal(id);
    }

    @Override
    public void editMeal(Setmeal setmeal) {

        //处理图片信息 查询基本信息
        Setmeal meal = findsetMealById(setmeal.getId());
        //删除数据库redis中原来的图片,添加新的图片,定时任务会清图片信息
        setMealDao.editMeal(setmeal);
        Jedis jedisDB = jedisPool.getResource();
        jedisDB.srem(RedisConstant.SETMEAL_PIC_DB_RESOURCES,meal.getImg());
        saveRedis(setmeal.getImg());

    }

    @Override
    public void editMealAndGroup(Integer id, Integer[] checkgroupIds) {
      //删除原来关系
        setMealDao.editMelAndGroup(id);
        //判断ids是否为空 不为空
        addMealAndGroup(checkgroupIds,id);
    }

    @Override
    public Integer[] findGroupIdByMealId(Integer setMealId) {
        Integer[] ids= setMealDao.findGroupIdByMealId(setMealId);
        return ids;
    }

    @Override
    public Setmeal findsetMealById(Integer setMealId) {
       Setmeal setmeal= setMealDao.findsetMealById(setMealId);
        return setmeal;
    }

}
